package com.csx.governance.traffic.adm.service;

import com.csx.governance.traffic.adm.model.bo.SwimLaneDefinitionBO;
import com.csx.governance.traffic.adm.model.bo.SwimLaneRouteRuleBO;
import com.csx.governance.traffic.adm.model.dto.ImportResultDTO;
import com.csx.governance.traffic.adm.model.dto.SwimLaneDefinitionDTO;
import com.csx.governance.traffic.adm.model.dto.SwimLaneRouteRuleDTO;
import com.csx.governance.traffic.adm.model.dto.SwimLaneRouteRuleTypeDTO;
import org.springframework.lang.Nullable;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 泳道路由服务
 * @author cuisongxu
 * @date 2023/4/23 15:30
 */
public interface SwimLaneRouteService {

    /**
     * 获取泳道路由规则列表
     * @param serviceName 服务名(可以为空，空的情况下表示获取所有规则)
     * @param pageNum 第几页
     * @param pageSize 每页大小
     * @return 泳道路由规则列表
     */
    List<SwimLaneRouteRuleDTO> getSwimLaneRouteRules(@Nullable String serviceName, Integer pageNum, Integer pageSize);

    /**
     * 新增泳道路由规则
     * @param swimLaneRouteRuleBO 泳道路由规则业务实体
     */
    void addSwimLaneRouteRule(SwimLaneRouteRuleBO swimLaneRouteRuleBO);

    /**
     * 修改泳道路由规则
     * @param swimLaneRouteRuleBO 泳道路由规则业务实体
     */
    void updateSwimLaneRouteRule(SwimLaneRouteRuleBO swimLaneRouteRuleBO);

    /**
     * 删除泳道路由规则
     * @param serviceNames 需要删除规则的服务名列表
     */
    void deleteSwimLaneRouteRules(List<String> serviceNames);

    /**
     * 导出泳道路由规则。特别注意: 导出的内容中除了泳道规则，还要包含规则中对应的泳道定义
     * @param serviceNames 需要导出的泳道路由规则的服务名列表
     * @param response 响应对象，将导出的内容写入到响应对象中
     */
    void exportSwimLaneRouteRules(List<String> serviceNames, HttpServletResponse response);

    /**
     * 导入泳道路由规则
     * @param content 导入内容
     * @param repeatStrategyCode 重复处理策略码: 0: 跳过; 1 覆盖; 2 终止
     * @return 导入结果
     */
    ImportResultDTO<ImportResultDTO.SwimLaneRouteRuleKDTO> importSwimLaneRouteRules(String content, Integer repeatStrategyCode);

    /**
     * 获取泳道定义列表
     * @param swimLaneId 泳道ID(可以为空，空的情况下表示获取所有泳道的泳道定义)
     * @param pageNum 第几页
     * @param pageSize 每页大小
     * @return 泳道定义列表
     */
    List<SwimLaneDefinitionDTO> getSwimLaneDefinitions(@Nullable String swimLaneId, Integer pageNum, Integer pageSize);

    /**
     * 新增泳道定义
     * @param swimLaneDefinitionBO 泳道定义实体
     */
    void addSwimLaneDefinition(SwimLaneDefinitionBO swimLaneDefinitionBO);

    /**
     * 修改泳道定义
     * @param swimLaneDefinitionBO 泳道定义实体
     */
    void updateSwimLaneDefinition(SwimLaneDefinitionBO swimLaneDefinitionBO);

    /**
     * 删除泳道定义
     * @param swimLaneIds 要删除的泳道定义ID列表
     */
    void deleteSwimLaneDefinitions(List<String> swimLaneIds);

    /**
     * 获取泳道路由规则类型列表
     * @return 泳道规则路由类型列表
     */
    List<SwimLaneRouteRuleTypeDTO> getSwimLaneRouteRuleTypes();
}
